// 缓存名称（版本号，更新缓存时修改）
const CACHE_NAME = 'my-pwa-cache-v1';
// 需要缓存的资源列表（仅列出实际存在且可访问的相对路径）
const ASSETS_TO_CACHE = [
  'index.html',
  'manifest.json',
  'data.json'
];

// 安装阶段：缓存资源
self.addEventListener('install', (event) => {
  // 等待缓存完成后再完成安装
  event.waitUntil(
    (async () => {
      const cache = await caches.open(CACHE_NAME);
      console.log('缓存资源（逐个添加，失败不阻断）:', ASSETS_TO_CACHE);
      for (const url of ASSETS_TO_CACHE) {
        try {
          const response = await fetch(url, { cache: 'no-cache' });
          if (response && response.ok) {
            await cache.put(url, response.clone());
          } else {
            console.warn('跳过加入缓存（非 2xx 响应）:', url, response && response.status);
          }
        } catch (e) {
          console.warn('加入缓存失败，已跳过:', url, e);
        }
      }
      await self.skipWaiting();
    })()
  );
});

// 激活阶段：清理旧缓存
self.addEventListener('activate', (event) => {
  event.waitUntil(
    caches.keys().then(cacheNames => {
      return Promise.all(
        cacheNames.map(name => {
          // 删除旧版本的缓存
          if (name !== CACHE_NAME) {
            console.log('删除旧缓存:', name);
            return caches.delete(name);
          }
        })
      );
    }).then(() => self.clients.claim()) // 激活后立即控制所有页面
  );
});

//  fetch 事件：拦截网络请求，返回缓存或请求新资源
self.addEventListener('fetch', (event) => {
  // 对于跨域请求，直接走网络（不缓存）
  if (!event.request.url.startsWith(self.location.origin)) {
    return;
  }

  // 优先从网络获取，失败时使用缓存
  event.respondWith(
    fetch(event.request)
      .then(networkResponse => {
        // 更新缓存（将新的响应存入缓存）
        caches.open(CACHE_NAME).then(cache => {
          cache.put(event.request, networkResponse.clone());
        });
        return networkResponse;
      })
      .catch(() => {
        // 网络请求失败，从缓存中获取
        return caches.match(event.request);
      })
  );
});
